fork [system call]

프로세스 기본구조
TEXT(code)
DATA        //초기값 o
BSS        //초기값 x
HEAP        //동적메모리 ex malloc
STACK        //정적메모리

TEXT, DATA, BSS는 컴파일 단계에서 생성
프로세스 생성
기본 프로세스 생성 과정
    1. TEXT, DATA, BSS, HEAP, STACK 공간을 생성
    2. 프로세스 이미지를 해당 공간에 업로드하고, 실행 시작
프로세스 계층: 다른 프로세스는 또다른 프로세스로부터 생성
    부모 프로세스, 자식 프로세스
fork() & exec() 시스템콜
fork() 시스템콜
    새로운 프로세스 공간을 별도로 만들고, fork() 시스템콜을 호출한 프로세스(부모 프로세스) 공간을 모두 복사
        별도의 프로세스 공간을 만들고, 부모 프로세스 공간의 데이터를 그대로 복사

exec() 시스템콜
    exec() 시스템콜을 호출한 현재 프로세스 공간의 TEXT, DATA, BSS 영역을 새로운 프로세스의 이미지로 덮어씌운다.
        별도의 프로세스 공간을 만들지 않는다.
fork()
#include <unistd.h>
pid_t fork(void);
// , pid 0 pid ()
fork_test.c
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main(void){
pid_t pid;
print("Before fork() call\n");
pid=fork();
if(pid==0)printf("This is Child process. PID is %d\n", pid);
else if(pid>0)printf("This is Parent process. PID is %d\n", pid);
else printf("fork() is failed\n");
return 0
}

Before fork() call

This is Parent process. PID is 1732

This is Child process. PID is 0

fork() 시스템콜
- pid=fork()가 실행되면 부모 프로세스와 동일한 자식 프로세스가 별도 메모리 공간에 생성
- 자식 프로세스는 pid가 0으로 리턴, 부모 프로세스는 자식 pid리턴
- 두 프로세스의 변수 및 PC(Program Count)는 동일
- 새로운 프로세스 공간을 별도로 만들고, fork() 시스템콜을 호출한 프로세스(부모 프로세스) 공간을 모두 복사한 후,
   fork() 시스템콜 이후 코드부터 실행